package com.txz.framework.utils.auth;

import com.txz.common.core.domain.model.LoginUser;
import com.txz.common.utils.StringUtils;
import com.txz.framework.web.service.TokenService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 通用认证工具类，封装密码加密、验证、Token生成和解析功能
 * 使用项目已有的 TokenService 和 BCryptPasswordEncoder
 */
@Component
public class AuthCommonUtil {

    @Resource
    private TokenService tokenService;
    @Resource // 注入当前请求对象
    private HttpServletRequest request;

    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    /**
     * 加密原始密码
     * @param rawPassword 原始密码
     * @return 加密后的密码
     * @throws IllegalArgumentException 如果原始密码为空
     */
    public String encryptPassword(String rawPassword) {
        if (StringUtils.isEmpty(rawPassword)) {
            throw new IllegalArgumentException("原始密码不能为空");
        }
        return passwordEncoder.encode(rawPassword);
    }

    /**
     * 验证原始密码与加密密码是否匹配
     * @param rawPassword 原始密码
     * @param encodedPassword 加密密码
     * @return 匹配结果（true/false）
     * @throws IllegalArgumentException 如果任一参数为空
     */
    public boolean verifyPassword(String rawPassword, String encodedPassword) {
        if (StringUtils.isEmpty(rawPassword) || StringUtils.isEmpty(encodedPassword)) {
            throw new IllegalArgumentException("原始密码和加密密码均不能为空");
        }
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 生成 Token
     * @param loginUser 登录用户对象
     * @return Token字符串
     * @throws IllegalArgumentException 如果 loginUser 或 userId 为空
     */
    public String generateToken(LoginUser loginUser) {
        if (loginUser == null || loginUser.getUserId() == null) {
            throw new IllegalArgumentException("LoginUser 或 userId 不能为空");
        }
        return tokenService.createToken(loginUser);
    }

    /**
 * 解析 Token 并返回 LoginUser 对象
 * @param token Token字符串
 * @return LoginUser 对象
 * @throws IllegalArgumentException 如果 Token 为空
 */
    public LoginUser parseToken(String token) {
        if (StringUtils.isEmpty(token)) {
            throw new IllegalArgumentException("Token 不能为空");
        }

        // 创建请求包装类，包装原始request
        ModifyHeaderRequestWrapper requestWrapper = new ModifyHeaderRequestWrapper(request);
        // 将Token放入请求头（格式与Ruoyi保持一致，通常为"Bearer token值"）
        requestWrapper.setHeader("Authorization", "Bearer " + token);

        // 调用TokenService的getLoginUser，传入包装后的request
        return tokenService.getLoginUser(requestWrapper);
    }
}